#include "malla.h"

#define RUNTEST(t,d) { cerr << endl << "Corriendo test " << #t << ": " << #d << endl; t(); cerr << "Terminado test " << #t << " OK!" << endl; }
#define NOROESTE 1
#define NORESTE 2
#define SUDESTE 3
#define SUDOESTE 4
void test1(){
    // chequeo de constructores , copias y asignaciones.
    Celda *celdaNula = new Celda();
    Celda celdaCopia(*celdaNula);
    Celda celdaAsignada = *celdaNula;
    assert(!celdaNula->esValida());
    assert(!celdaCopia.esValida());
    assert(!celdaAsignada.esValida());
    delete celdaNula;
    assert(!celdaCopia.esValida());
    assert(!celdaAsignada.esValida());
    // chequeo de operadores ==
    Celda celdaVacia(0,0);
    Celda celdaVacia2(0,0);
    Celda celdaComun(0,0,1,1);
    Celda celdaEntrada(NOROESTE,0,1,0);
    Celda celdaEntrada2(SUDOESTE,0,1,0);
    Celda celdaSalida(0,NORESTE,1,0);
    assert(celdaVacia == celdaVacia2);
    assert(celdaComun != celdaVacia);
    assert(celdaComun != celdaEntrada);
    assert(celdaComun != celdaSalida);
    assert(celdaEntrada != celdaSalida);
    assert(celdaEntrada != celdaEntrada2);
//     cout << celdaEntrada << endl;
//     cout << celdaComun << endl;
//     cout << celdaSalida << endl;
//     cout << celdaCopia << endl;
    // chequeo observadores
    //todas menos la nula son validas
    assert(!celdaCopia.esValida());
    assert(celdaVacia.esValida());
    assert(celdaComun.esValida());
    assert(celdaEntrada.esValida());
    assert(celdaSalida.esValida());
    assert(!celdaVacia.esCelda());
    assert(celdaComun.esCelda());
    assert(celdaEntrada.esCelda());
    assert(celdaSalida.esCelda());
    assert(!celdaComun.esSalida());
    assert(!celdaComun.esEntrada());
    assert(!celdaEntrada.esSalida());
    assert(celdaEntrada.esEntrada());
    assert(celdaSalida.esSalida());
    assert(!celdaSalida.esEntrada());
    assert(celdaEntrada.conexionEntrada() == NOROESTE);
    assert(celdaSalida.conexionSalida() == NORESTE);

}


void test2(){
    Malla m(5);
    m.show();
    Malla *simple= new Malla(3);
    Malla simple2(*simple);
    assert(*simple == simple2);
    delete simple;
    simple2.show();
    Celda entrada(NOROESTE,0,3,1);
    Celda salida(0,NOROESTE,0,0);
    Malla posible(6, entrada, salida);
    posible.show();



}

void test3(){
	Celda e(NOROESTE, 0, 0, 0);
	Celda s(0, SUDESTE, 3, 2);
	Malla m(4,e,s);
	m.setCelda(0,1);
	m.setCelda(1,1);
	m.setCelda(2,1);
	m.setCelda(2,2);
	m.resetCelda(1,0);
	m.resetCelda(2,0);
	m.resetCelda(3,0);
	m.resetCelda(3,1);
	double res = m.getResistencia();
	cout << "resistencia = " << res << endl;
	m.show();
    
    Celda i(NORESTE, 0, 1, 2);
    Celda o(0, SUDOESTE, 2,0);
    Malla n(3, i, o);
    n.setCelda(1,0);
    n.setCelda(1,1);
    n.getResistencia();
}

void test4(){


}
int main(){
    //RUNTEST(test1, Testeo de Celda);
    //RUNTEST(test2, Asignacion Constructores y Comparaciones);
    RUNTEST(test3, Test3);
    return 0;
}
